package com.zjny.config;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.cache.CacheManager;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.Duration;

/**
 * packageName com.zjny.config
 * 咖啡因进程内缓存配置
 *
 * @author cui haida
 * @version JDK 8
 * 2025/6/18
 */
@Configuration
// 当前仅当spring.cache.type=caffeine时生效
@ConditionalOnExpression("'${spring.cache.type}'.equals('caffeine')")
public class CaffeineCacheConfig {
    /**
     * 配置Caffeine缓存。
     *
     * @return Caffeine配置实例，用于构建缓存对象。
     */
    @Bean
    public Caffeine<Object, Object> caffeineConfig() {
        // 设置缓存的最大大小为50，以控制缓存的容量。
        return Caffeine.newBuilder().maximumSize(50)
                // 设置缓存条目的过期时间，这里设置为30秒，超过30秒未访问的缓存条目将被自动移除。
                .expireAfterWrite(Duration.ofSeconds(30));
    }


    /**
     * 这个方式一般封装成为工具类
     * 存储
     * Cache<String, Object> caffeine = (Cache<String, Object>) SpringUtils.getBean("caffeineCache");
     * caffeine.put(key, value);
     * 获取
     * Cache<String, Object> caffeine = (Cache<String, Object>) SpringUtils.getBean("caffeineCache");
     * Object value = caffeine.asMap().get(key);
     */
    @Bean
    public Cache<String, Object> caffeineCache() {
        // 创建一个名为"myCache"的缓存，使用caffeineConfig()方法获取的Caffeine配置。
        return Caffeine.newBuilder()
                .maximumSize(50)
                .expireAfterWrite(Duration.ofSeconds(30))
                .build();
    }


    /**
     * 配置缓存管理器。
     * 使用CaffeineCacheManager来管理缓存，它基于Caffeine构建，提供了缓存的创建和管理能力。
     * -> @Cacheable(key = "'paragraphNameList' + #paragraphType", cacheManager = "myCacheManager")
     * -> public List<ParagraphNameEntity> getParagraphNameList(String paragraphType)
     *
     * @return 返回配置好的CaffeineCacheManager实例。
     */
    @Bean(name = "myCacheManager")
    public CacheManager myCacheManager() {
        Caffeine<Object, Object> caffeine = Caffeine.newBuilder().maximumSize(50)
                // 设置缓存条目的过期时间，这里设置为30秒，超过30秒未访问的缓存条目将被自动移除。
                .expireAfterWrite(Duration.ofSeconds(30));
        CaffeineCacheManager cacheManager = new CaffeineCacheManager();
        cacheManager.setCaffeine(caffeine);
        return cacheManager;
    }
}